import time
from typing import List, Dict, Optional

class ContextManager:
    """
    上下文管理器，负责动态管理多任务对话中的上下文信息。
    """

    def __init__(self, max_length: int = 5):
        """
        初始化上下文管理器。

        :param max_length: 上下文存储的最大长度，超过该长度将进行裁剪。
        """
        self.contexts: Dict[str, List[Dict[str, str]]] = {}
        self.max_length = max_length

    def add_context(self, task_id: str, role: str, content: str):
        """
        添加上下文信息。

        :param task_id: 任务ID，用于区分不同的任务上下文。
        :param role: 角色名称，如'user'或'assistant'。
        :param content: 上下文内容。
        """
        if task_id not in self.contexts:
            self.contexts[task_id] = []
        self.contexts[task_id].append({'role': role, 'content': content, 'timestamp': time.time()})
        # 如果超过最大长度，移除最早的上下文
        if len(self.contexts[task_id]) > self.max_length:
            self.contexts[task_id].pop(0)

    def get_context(self, task_id: str) -> List[Dict[str, str]]:
        """
        获取指定任务的上下文信息。

        :param task_id: 任务ID。
        :return: 上下文信息列表。
        """
        return self.contexts.get(task_id, [])

    def remove_context(self, task_id: str):
        """
        移除指定任务的上下文信息。

        :param task_id: 任务ID。
        """
        if task_id in self.contexts:
            del self.contexts[task_id]

    def clear_all_contexts(self):
        """
        清除所有任务的上下文信息。
        """
        self.contexts.clear()

class TaskHandler:
    """
    任务处理器，模拟处理不同的任务，并利用上下文管理器管理上下文。
    """

    def __init__(self, context_manager: ContextManager):
        """
        初始化任务处理器。

        :param context_manager: 上下文管理器实例。
        """
        self.context_manager = context_manager

    def handle_task(self, task_id: str, user_input: str):
        """
        处理用户输入的任务。

        :param task_id: 任务ID。
        :param user_input: 用户输入的内容。
        """
        # 添加用户输入到上下文
        self.context_manager.add_context(task_id, 'user', user_input)

        # 根据用户输入决定任务类型
        if '天气' in user_input:
            response = self.get_weather_info(user_input)
        elif '新闻' in user_input:
            response = self.get_news_info(user_input)
        else:
            response = "抱歉，我无法理解您的请求。"

        # 添加助手的响应到上下文
        self.context_manager.add_context(task_id, 'assistant', response)

        # 输出当前上下文
        self.display_context(task_id)

    def get_weather_info(self, location: str) -> str:
        """
        获取天气信息的模拟方法。

        :param location: 地点信息。
        :return: 天气信息字符串。
        """
        # 模拟天气信息
        return f"{location}的天气是晴天，气温25摄氏度。"

    def get_news_info(self, topic: str) -> str:
        """
        获取新闻信息的模拟方法。

        :param topic: 新闻主题。
        :return: 新闻信息字符串。
        """
        # 模拟新闻信息
        return f"关于{topic}的最新新闻：今天发生了一件重要的事情。"

    def display_context(self, task_id: str):
        """
        显示指定任务的上下文信息。

        :param task_id: 任务ID。
        """
        context = self.context_manager.get_context(task_id)
        print(f"\n任务 {task_id} 的上下文：")
        for entry in context:
            role = "用户" if entry['role'] == 'user' else "助手"
            print(f"{role}: {entry['content']}")

# 示例运行
if __name__ == "__main__":
    # 创建上下文管理器
    context_manager = ContextManager(max_length=5)

    # 创建任务处理器
    task_handler = TaskHandler(context_manager)

    # 模拟用户输入并处理任务
    task_handler.handle_task("task1", "北京的天气怎么样？")
    task_handler.handle_task("task1", "今天晚上会下雨吗？")
    task_handler.handle_task("task2", "最近的科技新闻有哪些？")
    task_handler.handle_task("task2", "有没有关于人工智能的报道？")
    task_handler.handle_task("task1", "明天温度多少？")
    task_handler.handle_task("task2", "头条新闻是什么？")
    task_handler.handle_task("task1", "后天还能出太阳吗？")